package com.ruoyi.web.controller.tool;


import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.ImageUtils;
import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 微信小程序 二维码
 * @author 贡小天
 * @version  2024年2月20日
 */
@RestController
public class WxQrCodeController {
    @Autowired
    private RedisCache redisCache;

    private static final Logger log = LoggerFactory.getLogger(WxQrCodeController.class);

    /**
     * 小程序唯一凭证，即 AppID，可在「微信公众平台 - 设置 - 开发设置」页中获得。（需要已经成为开发者，且帐号没有异常状态）
     */
    @Value("${wechat.appId}")
    private  String appId;
    /**
     * 小程序唯一凭证密钥，即 AppSecret，获取方式同 appid
     */
    @Value("${wechat.secret}")
    private  String secret;
    /**
     * accessToken请求地址
     */
    @Value("${wechat.url}")
    private  String url;

    /**
     * 获取微信小程序码
     *
     * @date  2024年2月20日
     * @return 微信小程序码 bas64
     */
    @PostMapping("getWxXcxQrCode")
    public AjaxResult getWxXcxQrCode()
    {
        AjaxResult ajax = AjaxResult.success();
        try {
            String qrCode = getQrCode("", Math.random()+"", postToken());
            ajax.put("base64", qrCode);
        }catch (Exception e){
            e.printStackTrace();
        }
        return ajax;
    }

    /**
     * 获取微信token
     */
    public  String postToken() throws Exception {
        String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + secret;
        URL url = new URL(requestUrl);
        // 打开和URL之间的连接
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        // 设置通用的请求属性
        connection.setRequestProperty("Content-Type", "application/json");
        connection.setRequestProperty("Connection", "Keep-Alive");
        connection.setUseCaches(false);
        connection.setDoOutput(true);
        connection.setDoInput(true);

        // 得到请求的输出流对象
        DataOutputStream out = new DataOutputStream(connection.getOutputStream());
        out.writeBytes("");
        out.flush();
        out.close();

        // 建立实际的连接
        connection.connect();
        // 定义 BufferedReader输入流来读取URL的响应
        BufferedReader in = null;
        if (requestUrl.contains("nlp")) {
            in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "GBK"));
        } else {
            in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
        }
        String result = "";
        String getLine;
        while ((getLine = in.readLine()) != null) {
            result += getLine;
        }
        in.close();
        JSONObject jsonObject = JSON.parseObject(result);
        String accesstoken = jsonObject.getString("access_token");
        return accesstoken;
    }



    /**
     * 获取预览二维码
     * @param pageUrl
     * @param scene
     * @param weChatToken
     * @return
     */
    private String getQrCode(String pageUrl, String scene, String weChatToken){
        String qrCode="";
        String url= String.format("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=%s", weChatToken);
        RestTemplate restTemplate = new RestTemplate();
        JSONObject json         = new JSONObject();
        if(StringUtils.isNotBlank(scene)){
            // 页面参数可能带有&等符号会被解析成&amp;
            scene= scene.replaceAll("&amp;", "&");
        }
        // 页面路径不能以/开头 需要判断
        json.put("page", StringUtils.isNotBlank(pageUrl) ? pageUrl.startsWith("/") ? pageUrl.replaceFirst("/", "") : pageUrl : null);
        json.put("scene", StringUtils.isNotBlank(scene) ? scene : "pre=1");
        byte[] resultBytes = restTemplate.postForObject(url, json, byte[].class);
        if (resultBytes != null && resultBytes.length > 0) {
            return "data:image/png;base64," + new String(Base64.encodeBase64(resultBytes));
        }
        return qrCode;
    }
}
